package com.bestdreamer.arrays;

import java.util.Arrays;

public class ReverseArrays {

    /**
     * 方法一
     * 考虑将数组逆序，然后将数组划分为两部分，前半部分为前 K 个数，后半部分为剩下的数，再分别对他们进行逆序
     * @param arr
     * @param k
     */
    public static void CircleRightArray(int[] arr,int k){
        int length = arr.length;
        k = k % length;
        if( k == 0){
            return;
        }
        reverse(arr,0,length-1); // 逆序数组
        reverse(arr,0,k-1);
        reverse(arr,k,length-1);
    }

    public static void reverse(int[] arr,int i,int j){
        while( i < j ){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }

    /**
     * 方法二
     * 首先考虑k，如果k能被数组长度 length 整除，那么数组顺序不变，可以直接输出数组，如果不能整除，得到 k =k%length
     * 将数组右移k次，每次都把数组最后一位保存，然后从下表 length -2 到 0 的数都往右移动一位，最后把原来最后一位放到数组开头
     * @param arr
     * @param k
     */
    public static void CircleRight2(int[] arr,int k){
        int length = arr.length;
        k = k%length;
        if(k == 0){
            return;
        }
        while( k >0 ){
            int temp = arr[length-1];
            for(int i = length - 1; i>0; i--){
                arr[i] = arr[i-1];
            }
            arr[0] = temp;
            k--;
        }
    }

    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
//        CircleRightArray(arr,5);
        CircleRight2(arr,5);
        System.out.println(Arrays.toString(arr));
    }
}
